import tkinter as tk
from PIL import Image, ImageTk
import cv2
import os


def create_root(img_path):
    if not os.path.isfile(img_path):     #os.path.isfile()用于判断某一对象(需提供绝对路径)是否为文件
        print('no such file')
        raise AttributeError('no such image file')
    w = 1280
    h = 720
    root = tk.Tk()  #创建窗口
    root.geometry('{}x{}'.format(w, h))          #设置主窗口的大小
    root.wm_attributes('-fullscreen', 'true')    #全屏显示(最大化窗口),但是不显示标题栏.要使用标题栏显示最大化窗口,请使用"-zoomed 缩放"属性
    canvas = tk.Canvas(root, width=w, height=h)    #创建Canvas 区域,默认颜色是浅灰色：#E4E4E4
    canvas.pack()       #将canvas添加到主窗口
    # photo = ImageTk.PhotoImage(Image.open(img_path).resize((w, h), Image.ANTIALIAS))
    photo = tk.PhotoImage(file=img_path)   #不能简单地将图像文件的路径传递给image参数。相反，需要创建一个PhotoImage对象并将图像参数传递给它,
                                           #此语法将图像的路径传递给文件参数以创建新的PhotoImage对象,创建PhotoImage对象后，可以在其他接受图像参数的小部件中使用它.
    canvas.background = photo       #画布背景,默认颜色是浅灰色：#E4E4E4
    bg = canvas.create_image(0, 0, anchor=tk.NW, image=photo)    #给予不同的anchor参数，是指图片的不同位置与中心点0,0对齐

    return root  #, canvas


def show_video(cap, label, w, h, last_frame=None, interval=30, callback=None):
    lmain = label
    def show_frame():
        _, frame = cap.read()
        # frame = cv2.flip(frame, 1)
        # img = Image.fromarray(cv2image)
        # imgtk = ImageTk.PhotoImage(image=img)
        # lmain.imgtk = imgtk
        # lmain.configure(image=imgtk)
        if last_frame is not None:
            last_frame[0] = frame
        show_image_on_label(frame, lmain, w, h)
        if callback is not None: callback()
        lmain.after(interval, show_frame)
    show_frame()


def show_image_on_label(img, label, w, h):
    if label is None: return
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)   #对图像进行转换
    img = cv2.resize(img, (w, h))
    img = Image.fromarray(img)      #将np.array转成image格式的图像。
    imgtk = ImageTk.PhotoImage(image=img)  #将图像的路径传递给文件参数以创建新的PhotoImage对象,创建PhotoImage对象后，可以在其他接受图像参数的小部件中使用它
    label.imgtk = imgtk   
    label.configure(image=imgtk)   #通过 tk.Label.configure() 方法来更改text属性


def camera_cap():
    width, height = 640, 480
    cap = cv2.VideoCapture(0)      #捕获摄像头视频     
    
    #cap.set(参数编号，参数) ，即设置摄像头参数
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)     #cap.set(参数编号，参数) ，即设置摄像头参数.此处为视频流中帧的宽度
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)   #视频流中帧的高度
    return cap
